#include "config.h"
#include "ringbuffer.h"

// PB05->NSSC
// PA0.9->SPI_SCK,
// PA0.10->SPI_MOSI,
// PA0.11->SPI_MIS0

#ifdef SPI_LOG_ENABLE
#define SPI_PRINT(format, ...)  log_print(format, ##__VA_ARGS__)
#else
#define SPI_PRINT(format, ...)
#endif


void spi_rxd_irq_handle(uint8_t byte)
{
    SPI_PRINT("recv: 0x%x\r\n", byte);
    RingBuffer_Write_Byte(byte);
}

void spi_init(void)
{
    RingBuffer_Init();

    SPI_DeInit();
    // NSS --> PB05
    SPI_NSS_IO_Init(1);
    // SPI_SCK->PB0.4
    //SPI_MOSI->PA0.14,SPI_MISO->PA0.15
    SPI_Master_Init(SPI_G2,SPI_DATA_SIZE_8BIT,SPI_SPO_0,\
                    SPI_SPH_0,SPI_LBM_0,SPI_RXIFLSEL_1_8,0, 24);
    // 选择 SPI IO group1;
    // 发送数据大小为 8BIT;
    // SCK 工作时为低电平;
    // SCK 第一个时钟沿捕捉;
    // 串行正常输出; 
    // 接收占用 1/8 FIFO 中断触发断点; 
    // FSSPCLKOUT=24M/8=3M

    SPI_ConfigInterrupt_CMD(ENABLE,SPI_RXIM); //使能 FIFO 接收中断
    SPI_Int_Enable();
}

void spi_deinit(void)
{
    SPI_DeInit();
}

int spi_send_byte(const uint8_t byte)
{
    int ret = 0;
    SPI_WRITE_BYTE(byte);
    return ret;
}

int spi_recv_byte(uint8_t* byte)
{
    int ret = 0;
    if(byte == NULL) {
        return -1;
    }
    ret = RingBuffer_Read_Byte(byte);
    return ret;
}

int spi_send_bytes(uint8_t* data, uint8_t len)
{
    if(data == NULL) {
        return -1;
    }
    for (int i = 0; i < len; i++) {
        SPI_WRITE_BYTE(data[i]);
    }
    return len;
}

